import socket
import cv2
import numpy as np

# 网络配置（需要与 C++ 代码中的设置一致）
HOST = '0.0.0.0'  # 监听所有接口
PORT = 8080
BUFFER_SIZE = 1024 * 1024  # 接收缓冲区大小

with socket.socket(socket.AF_INET, socket.SOCK_DGRAM) as s:
    s.bind((HOST, PORT))
    print(f"等待连接在 {HOST}:{PORT}...")

    while True:
        try:
            # 接收 UDP 数据包
            data, addr = s.recvfrom(BUFFER_SIZE)
            print(f"收到数据包来自 {addr}")

            # 解析数据包中的图像数据
            # 假设每个数据包的前 4 字节是图像数据的长度
            if len(data) < 4:
                print("数据包太小，无法解析")
                continue

            img_size = int.from_bytes(data[:4], byteorder='big')  # 图像数据长度
            img_data = data[4:]  # 图像数据

            # 确保接收到的数据长度与预期一致
            if len(img_data) != img_size:
                print(f"图像数据长度不匹配: {len(img_data)} vs {img_size}")
                continue

            # 解码并显示图像
            img_np = np.frombuffer(img_data, dtype=np.uint8)
            frame = cv2.imdecode(img_np, cv2.IMREAD_COLOR)
            if frame is not None:
                frame = cv2.resize(frame, (640, 480), interpolation=cv2.INTER_LINEAR)
                cv2.imshow('Received Image', frame)
                if cv2.waitKey(1) == 27:  # ESC 键退出
                    break
            else:
                print("图像解码失败")
        except Exception as e:
            print(f"发生错误: {e}")

cv2.destroyAllWindows()